const db = uniCloud.database();
const $ = db.command.aggregate;
module.exports = {
	/**
	 * 获取城市边界数据
	 * @returns {object} 返回城市边界数据
	 */
	async getCityBoundary() {
		// 调用阿里云城市边界数据
		let res = await uniCloud.httpclient.request(
			'https://geo.datav.aliyun.com/areas_v3/bound/100000_full_city.json', {
				method: 'GET',
				dataType: 'json'
			}
		);
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 付费活动报名处理
	 * @param {string} data:报名数据
	 * @returns {object} 返回报名成功状态
	 */
	async signUp(out_trade_no) {
		let error = [];
		// 根据out_trade_no查询订单
		const res = await db.collection('uni-pay-orders').where({
			out_trade_no: out_trade_no
		}).get();
		// 判断订单支付状态
		if (res.data[0].status != 1) {
			error.push('用户未实际付款');
		}
		const activity = await db.collection('qmy-activity').where({
			_id: res.data[0].custom.activity_id
		}).get();
		// 判断活动是否存在
		if (!activity.data[0]) {
			error.push('用户报名的活动不存在');
		}
		// 判断订单支付时间是否在活动报名时间内
		if (res.data[0].pay_date < activity.data[0].signup_start_time || res.data[0].pay_date > activity.data[0]
			.signup_end_time) {
			error.push('用户报名的活动不在报名时间内');
		}
		// 判断活动是否审核通过
		if (activity.data[0].audit_status != 1) {
			error.push('用户报名的活动未审核');
		}
		// 判断是否已经报名
		const signup = await db.collection('qmy-activity-sign-up').where({
			activity_id: activity.data[0]._id,
			user_id: res.data[0].user_id
		}).get();
		if (signup.data.length && signup.data[0].signup_status == 0) {
			error.push('用户重复报名');
		}
		// 判断用户是否存在联系方式
		const user = await db.collection('uni-id-users').where({
			_id: res.data[0].user_id
		}).get();
		if (!user.data[0].mobile) {
			error.push('用户未完善联系方式');
		}
		// 判断订单支付金额是否等于活动付费金额
		if (res.data[0].total_fee != activity.data[0].pay_amount) {
			error.push('用户支付订单金额与活动金额不一致');
		}
		// 如果报名失败，则更新订单失败说明
		if (error.length) {
			await db.collection('uni-pay-orders').where({
				out_trade_no: out_trade_no
			}).update({
				custom: {
					activity_id: res.data[0].custom.activity_id,
					signup_error: error
				}
			});
			return {
				code: 400,
				data: error
			}
		}
		let signupRes = [];
		// 校验通过，新增报名数据，如果用户已经报名过此活动不过取消报名，再次报名时更新，而不是新增
		if (signup.data.length) {
			signupRes = await db.collection('qmy-activity-sign-up').where({
				_id: signup.data[0]._id
			}).update({
				signup_amount: res.data[0].total_fee, // 报名金额
				order_id: res.data[0].out_trade_no, // 订单号
				signup_status: 0,
				signup_time: Date.now()
			});
		} else {
			signupRes = await db.collection('qmy-activity-sign-up').add({
				user_id: res.data[0].user_id, // 用户id
				activity_id: activity.data[0]._id, // 活动id
				signup_amount: res.data[0].total_fee, // 报名金额
				order_id: res.data[0].out_trade_no, // 订单号
				signup_status: 0, // 报名状态
				signup_time: Date.now() // 报名时间
			});
		}
		return {
			code: 200,
			data: signupRes.data,
			msg: '报名成功'
		}
	},
	/**
	 * 余额充值
	 * @param {string} out_trade_no:订单号
	 * @returns {object} 返回充值成功状态
	 */
	async recharge(out_trade_no) {
		let error = [];
		// 根据out_trade_no查询订单
		const res = await db.collection('uni-pay-orders').where({
			out_trade_no: out_trade_no
		}).get();
		// 如果订单不存在，则返回错误
		if (!res.data[0]) {
			error.push('支付订单不存在');
		}
		// 判断订单支付状态
		if (res.data[0].status != 1) {
			error.push('用户未实际付款');
		}
		// 如果余额充值金额小于1元，则返回错误
		// if (res.data[0].total_fee < 100) {
		// 	error.push('余额充值金额不能小于1元');
		// }
		// 如果不存在用户id，则返回错误
		if (!res.data[0].user_id) {
			error.push('用户未登录或登录状态过期');
		}
		// 如果充值失败，添加充值失败原因
		if (error.length) {
			await db.collection('uni-pay-orders').where({
				out_trade_no: out_trade_no
			}).update({
				custom: {
					recharge_error: error
				}
			});
			return {
				code: 400,
				data: error
			}
		}
		// 查询充值套餐列表中是否存在用户充值金额，并确认是否有赠送金额
		const rechargeMenu = await db.collection('qmy-recharge-menu').where({
			money: res.data[0].total_fee
		}).get();
		// 查询用户当前余额
		const userWallet = await db.collection('qmy-user-wallet').where({
			user_id: res.data[0].user_id
		}).orderBy('create_date', 'desc').limit(1).get();
		const balance = userWallet.data[0]?.balance || 0;
		let addWallet = res.data[0].total_fee;
		// 如果充值套餐列表中存在用户充值金额，则增加赠送金额
		if (rechargeMenu.data[0]) {
			addWallet += rechargeMenu.data[0].give_money;
		}
		// 增加余额记录
		await db.collection('qmy-user-wallet').add({
			user_id: res.data[0].user_id,
			money: addWallet,
			type: 1,
			balance: balance + addWallet,
			comment: '余额充值',
			create_date: Date.now()
		});
		return {
			code: 200,
			data: '充值成功'
		}
	},
	/**
	 * 获取轮播图列表
	 * @param {string} category_id:分类id
	 * @returns {object} 返回轮播图列表
	 */
	async getBanner(category_id) {
		if (!category_id) {
			return {
				code: 400,
				data: '请求参数错误'
			}
		}
		const res = await db.collection('opendb-banner').where({
			category_id,
			status: true
		}).orderBy('sort', 'asc').get();
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取活动分类
	 * @returns {object} 返回活动分类
	 */
	async getActivityType() {
		const res = await db.collection('qmy-activity-class').orderBy('sort', 'asc', 'create_date', 'desc')
			.get();
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取活动数据,typeId为空则获取所有活动数据
	 * @param {object} data:活动分类id、活动名称、分页页码、分页每页数量
	 * @param {string} data.typeId:活动分类id
	 * @param {string} data.name:活动名称
	 * @param {number} data.page:分页页码
	 * @param {number} data.pageSize:分页每页数量
	 * @param {boolean} data.is_recommend:是否精选
	 * @returns {object} 返回活动数据
	 */
	async getActivityData(data) {
		const regExp = new RegExp(data.name, 'i');
		const res = await db.collection('qmy-activity').aggregate()
			// 先进行条件查询，节省数据量，提高数据查询处理效率
			.match({
				name: regExp,
				type: data.typeId,
				is_recommend: data.is_recommend,
				audit_status: 1
			})
			// 关联用户表获取发布者昵称和头像
			.lookup({
				from: 'uni-id-users', // 用户表
				localField: 'user_id', // 当前表活动表的字段
				foreignField: '_id', // 用户表中的用户ID字段
				as: 'create_user_info' // 将关联数据放到 user_info 字段中
			})
			// 关联活动表和报名表
			.lookup({
				from: 'qmy-activity-sign-up', // 报名表
				localField: '_id', // 当前表活动表的字段
				foreignField: 'activity_id', // 报名表中的活动ID字段
				as: 'sign_up_info' // 将关联数据放到 sign_up_info 字段中
			})
			.addFields({
				sign_up: $.filter({
					input: '$sign_up_info',
					as: 'item',
					cond: $.eq(['$$item.signup_status', 0])
				}), //取出字段里的报名状态为0：已报名的数据
			})
			// 关联报名表和用户表
			.lookup({
				from: 'uni-id-users', // 用户表
				localField: 'sign_up.user_id', // 报名表中的用户ID字段
				foreignField: '_id', // 用户表中的用户ID字段
				as: 'user_info' // 将关联数据放到 user_info 字段中
			})
			// 取出user_info和create_user_info里的用户id、昵称、头像到新数组里
			.addFields({
				user_info: $.map({
					input: '$user_info',
					as: 'item',
					in: {
						user_id: '$$item._id',
						user_name: '$$item.nickname',
						user_avatar: '$$item.avatar_file.url'
					}
				}),
				create_user_name: $.arrayElemAt(['$create_user_info.nickname', 0]), //取出字段里的发布者昵称
				create_user_avatar: $.arrayElemAt(['$create_user_info.avatar_file.url', 0]), //取出字段里的发布者头像
				create_user_gender: $.arrayElemAt(['$create_user_info.gender', 0]), //取出字段里的发布者性别
			})
			.project({
				sign_up_info: false,
				sign_up: false,
				create_user_info: false
			})
			.sort({
				sort: 1,
				signup_start_time: -1,
				start_time: -1
			})
			.skip(data.page * data.pageSize || 0)
			.limit(data.pageSize || 300)
			.end();

		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取活动详情
	 * @param {string} id:活动id
	 * @returns {object} 返回活动详情
	 */
	async getActivityDetail(id) {
		if (!id) {
			let error = new Error('请求参数错误');
			error.code = 400;
			throw error;
		}
		const res = await db.collection('qmy-activity').aggregate()
			// 先进行条件查询，节省数据量，提高数据查询处理效率
			.match({
				_id: id, //条件查询
			})
			.lookup({
				from: 'uni-id-users', //关联用户表
				localField: 'user_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'user_info' //存放用户信息的新字段
			})
			.addFields({
				user_name: $.arrayElemAt(['$user_info.nickname', 0]), //取出字段里的发布者昵称
				user_avatar: $.arrayElemAt(['$user_info.avatar_file.url', 0]), //取出字段里的发布者头像
				user_gender: $.arrayElemAt(['$user_info.gender', 0]), //取出字段里的发布者性别
				user_mobile: $.arrayElemAt(['$user_info.mobile', 0]) //取出字段里的手机号
			})
			.project({
				user_info: false, //去除发布者用户数据，一定要去除，不然会输出发布者数据库里的所有用户数据
			}).end();
		// 如果活动活动未审核通过，则返回空数据
		if (res.data[0].audit_status !== 1) {
			let error = new Error('活动未审核通过');
			error.code = 400;
			throw error;
		}
		// 如果活动不存在，则返回空数据
		if (!res.data[0]) {
			let error = new Error('活动不存在');
			error.code = 400;
			throw error;
		}
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取报名数据
	 * @param {string} id:活动id
	 * @returns {object} 返回报名数据
	 */
	async getSignupData(id) {
		const res = await db.collection('qmy-activity-sign-up').aggregate()
			// 先进行条件查询，节省数据量，提高数据查询处理效率
			.match({
				activity_id: id, //条件查询
				signup_status: 0
			})
			.lookup({
				from: 'uni-id-users', //关联用户表
				localField: 'user_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'user_info' //存放用户信息的新字段
			}).addFields({
				user_name: $.arrayElemAt(['$user_info.nickname', 0]), //取出字段里的发布者昵称
				user_avatar: $.arrayElemAt(['$user_info.avatar_file.url', 0]), //取出字段里的发布者头像
				user_gender: $.arrayElemAt(['$user_info.gender', 0]), //取出字段里的发布者性别
			}).project({
				user_info: false, //去除报名者用户数据，一定要去除，不然会输出报名者数据库里的所有用户数据
			}).end();
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取圈子列表
	 * @param {number} current:排序条件
	 * @param {string} searchText:搜索框内容
	 * @param {number} page:分页页码
	 * @param {number} pageSize:分页每页数量
	 * @returns {object} 返回圈子列表
	 */
	async getCircleList(searchText, current, page, pageSize) {
		let sort = {
			last_modify_date: -1,
			publish_date: -1,
		}
		if (current == 1) {
			sort = {
				is_essence: -1,
				last_modify_date: -1,
				publish_date: -1,
			}

		}
		if (current == 2) {
			sort = {
				is_sticky: -1,
				last_modify_date: -1,
				publish_date: -1,
			}
		}
		if (current == 3) {
			sort = {
				like_count: -1,
				last_modify_date: -1,
				publish_date: -1,
			}
		}
		// 关联用户表获取发布者昵称头像,关联活动表获取活动名称和图片，关联点赞表获取点赞数，关联评论表获取评论数
		const res = await db.collection('uni-cms-articles').aggregate()
			// 先进行条件查询，节省数据量，提高数据查询处理效率
			.match({
				title: new RegExp(searchText, 'i'),
				audit_status: 1,
				article_status: 1
			})
			// 关联用户表获取发布者昵称头像
			.lookup({
				from: 'uni-id-users', //关联用户表
				localField: 'user_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'user_info' //存放用户信息的新字段
			})
			.lookup({
				from: 'qmy-activity', //关联活动表
				localField: 'activity_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'activity_info' //存放活动信息的新字段
			})
			.lookup({
				from: 'opendb-news-comments', //关联评论表
				localField: '_id', //关联的字段
				foreignField: 'article_id', //被关联的字段
				as: 'comment_info' //存放评论信息的新字段
			})
			.lookup({
				from: 'qmy-article-like', //关联点赞表
				localField: '_id', //关联的字段
				foreignField: 'article_id', //被关联的字段
				as: 'like_info' //存放点赞信息的新字段
			})
			// 筛选评论表comment_type等于0的数据，0表示对文章的评论
			// .addFields({
			// 	filtered_comments: $.filter({
			// 		input: "$comment_info",
			// 		as: "comment",
			// 		cond: {
			// 			$eq: ["$$comment.comment_type", 0]
			// 		}
			// 	}),
			// })
			.addFields({
				user_name: $.arrayElemAt(['$user_info.nickname', 0]), //取出字段里的发布者昵称
				user_avatar: $.arrayElemAt(['$user_info.avatar_file.url', 0]), //取出字段里的发布者头像
				user_gender: $.arrayElemAt(['$user_info.gender', 0]),
				activity_name: $.arrayElemAt(['$activity_info.name', 0]), //取出字段里的活动名称
				activity_img: $.arrayElemAt(['$activity_info.imgs', 0]), //取出字段里的活动图片
				like_user_id: '$like_info.user_id', //取出字段里的点赞用户id
				// comment_count: '$filtered_comments.user_id' //取出字段里的评论者的id
				comment_count: $.size($.filter({
					input: "$comment_info",
					as: "comment",
					cond: {
						$eq: ["$$comment.comment_type", 0]
					}
				}))
			}).project({
				user_info: false, //去除发布者用户数据，一定要去除，不然会输出发布者数据库里的所有用户数据
				activity_info: false, //去除活动数据
				like_info: false, //去除点赞数据
				comment_info: false, //去除评论数据
			}).sort(sort)
			.skip(page * pageSize || 0)
			.limit(pageSize || 100).end();
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取圈子详情
	 * @param {string} id:圈子id
	 * @returns {object} 返回圈子详情
	 */
	async getCircleDetail(id) {
		if (!id) {
			let error = new Error('请求参数错误');
			error.code = 400;
			throw error;
		}
		const res = await db.collection('uni-cms-articles').aggregate()
			// 先进行条件查询，节省数据量，提高数据查询处理效率
			.match({
				_id: id, //条件查询
				audit_status: 1,
				article_status: 1
			})
			.lookup({
				from: 'uni-id-users', //关联用户表
				localField: 'user_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'user_info' //存放用户信息的新字段
			})
			.lookup({
				from: 'qmy-activity', //关联活动表
				localField: 'activity_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'activity_info' //存放活动信息的新字段
			})
			.lookup({
				from: 'qmy-activity-sign-up', //关联报名表
				localField: 'activity_id', //关联的字段
				foreignField: 'activity_id', //被关联的字段
				as: 'sign_up_info' //存放报名信息的新字段
			})
			.lookup({
				from: 'qmy-article-like', //关联点赞表
				localField: '_id', //关联的字段
				foreignField: 'article_id', //被关联的字段
				as: 'like_info' //存放点赞信息的新字段
			})
			.addFields({
				user_name: $.arrayElemAt(['$user_info.nickname', 0]), //取出字段里的发布者昵称
				user_avatar: $.arrayElemAt(['$user_info.avatar_file.url', 0]), //取出字段里的发布者头像
				user_gender: $.arrayElemAt(['$user_info.gender', 0]), //取出字段里的发布者性别
				activity_name: $.arrayElemAt(['$activity_info.name', 0]), //取出字段里的活动名称
				activity_img: $.arrayElemAt(['$activity_info.imgs', 0]), //取出字段里的活动图片
				sign_up: $.filter({
					input: '$sign_up_info',
					as: 'item',
					cond: $.eq(['$$item.signup_status', 0])
				}), //取出字段里的报名状态为0：已报名的数据
				like_user_id: '$like_info.user_id', //取出字段里的点赞用户id
			})
			.addFields({
				sign_up_count: $.size('$sign_up') //获取报名数据长度得到报名人数
			})
			.project({
				user_info: false, //去除发布者用户数据，一定要去除，不然会输出发布者数据库里的所有用户数据
				activity_info: false, //去除活动数据
				sign_up_info: false, //去除报名数据
				sign_up: false, //去除报名数据
				last_modify_ip: false, //去除修改ip
				publish_ip: false, //去除发布ip
				like_info: false, //去除点赞数据
			}).end();
		// 如果圈子未审核通过，则返回空数据
		if (res.data[0]?.audit_status !== 1) {
			let error = new Error('圈子未审核通过');
			error.code = 400;
			throw error;
		}
		// 如果圈子未发布，则返回空数据
		if (res.data[0]?.article_status !== 1) {
			let error = new Error('圈子还未发布');
			error.code = 400;
			throw error;
		}
		// 如果查询的圈子不存在，则返回空数据
		if (!res.data[0]) {
			let error = new Error('圈子不存在');
			error.code = 400;
			throw error;
		}
		return {
			code: 200,
			data: res.data
		}
	},

	/**
	 * 获取圈子评论和每条评论的关联评论
	 * @param {string} id:圈子id
	 * @returns {object} 返回圈子评论和每条评论的关联评论
	 */
	async getCircleComment(id) {
		const res = await db.collection('opendb-news-comments').aggregate()
			// 先进行条件查询，节省数据量，提高数据查询处理效率
			.match({
				article_id: id,
				comment_type: 0 //针对文章的评论
			})
			// 获取评论者信息
			.lookup({
				from: 'uni-id-users', //关联用户表
				localField: 'user_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'user_info' //存放用户信息的新字段
			})
			// 获取评论点赞信息
			.lookup({
				from: 'qmy-article-like', //关联点赞表
				localField: '_id', //关联的字段
				foreignField: 'comment_id', //被关联的字段
				as: 'like_info' //存放点赞信息的新字段
			})
			// 获取评论的关联评论信息
			.lookup({
				from: 'opendb-news-comments', //关联评论表
				localField: '_id', //关联的字段
				foreignField: 'superlative_comment_id', //被关联的字段
				as: 'reply_comment_info' //存放关联评论信息的新字段
			})
			// 获取评论的关联评论发布者信息
			.lookup({
				from: 'uni-id-users', //关联用户表
				localField: 'reply_comment_info.user_id', //关联的字段
				foreignField: '_id', //被关联的字段
				as: 'reply_user_info' //存放用户信息的新字段
			})
			// 获取评论的关联评论点赞信息
			.lookup({
				from: 'qmy-article-like', //关联点赞表
				localField: 'reply_comment_info._id', //关联的字段
				foreignField: 'comment_id', //被关联的字段
				as: 'reply_like_info' //存放点赞信息的新字段
			})
			// 处理评论者用户信息
			.addFields({
				user_name: $.arrayElemAt(['$user_info.nickname', 0]), //取出字段里的发布者昵称
				user_avatar: $.arrayElemAt(['$user_info.avatar_file.url', 0]), //取出字段里的发布者头像
				user_gender: $.arrayElemAt(['$user_info.gender', 0]), //取出字段里的发布者性别
				like_user_id: '$like_info.user_id' //获取点赞用户id
			})
			// 处理评论的关联评论信息
			.addFields({
				sorted_reply_comment_info: $.reverseArray("$reply_comment_info") // 让关联评论按 create_date 降序排列
			})
			// 处理关联评论信息
			.addFields({
				new_reply_comment_info: $.map({
					input: "$sorted_reply_comment_info", // 处理排序后的关联评论
					as: "item",
					in: $.mergeObjects([
						"$$item",
						{
							// 获取关联评论发布者的昵称
							reply_user_name: $.cond({
								if: {
									$gt: [{
										$size: "$reply_user_info"
									}, 0]
								},
								then: $.let({
									vars: {
										user: $.arrayElemAt([
											$.filter({
												input: "$reply_user_info",
												as: "user",
												cond: $.eq(["$$user._id",
													"$$item.user_id"
												])
											}),
											0
										])
									},
									in: "$$user.nickname" // 仅返回昵称，若无则返回 null
								}),
								else: null
							}),
							// 获取关联评论发布者的头像
							reply_user_avatar: $.cond({
								if: {
									$gt: [{
										$size: "$reply_user_info"
									}, 0]
								},
								then: $.let({
									vars: {
										user: $.arrayElemAt([
											$.filter({
												input: "$reply_user_info",
												as: "user",
												cond: $.eq(["$$user._id",
													"$$item.user_id"
												])
											}),
											0
										])
									},
									in: "$$user.avatar_file.url" // 仅返回头像，若无则返回 null
								}),
								else: null
							}),
							// 获取关联评论发布者的性别
							reply_user_gender: $.cond({
								if: {
									$gt: [{
										$size: "$reply_user_info"
									}, 0]
								},
								then: $.let({
									vars: {
										user: $.arrayElemAt([
											$.filter({
												input: "$reply_user_info",
												as: "user",
												cond: $.eq(["$$user._id",
													"$$item.user_id"
												])
											}),
											0
										])
									},
									in: "$$user.gender" // 仅返回性别，若无则返回 null
								}),
								else: null
							}),
							// 获取关联评论点赞的用户 ID
							reply_like_user_id: $.map({
								input: $.filter({
									input: "$reply_like_info",
									as: "like",
									cond: {
										$eq: ["$$like.comment_id",
											"$$item._id"
										]
									}
								}),
								as: "filtered_like",
								in: "$$filtered_like.user_id" // 只取 user_id
							})
						}
					])
				})
			})

			.project({
				user_info: false, //去除发布者用户数据，一定要去除，不然会输出发布者数据库里的所有用户数据
				like_info: false, //去除点赞数据
				reply_user_info: false, //去除关联评论发布者用户数据
				reply_comment_info: false, //去除关联评论数据
				sorted_reply_comment_info: false, //去除排序后的关联评论数据
				reply_like_info: false, //去除关联评论点赞数据
			})
			.sort({
				create_date: -1
			}).end();

		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取活动标签列表
	 * @returns {object} 返回活动标签列表
	 */
	async getTagList() {
		const res = await db.collection('qmy-activity-tags').where({
			is_enable: true
		}).orderBy('sort', 'asc', 'create_time', 'desc').get();
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取问题分类和分类对应的问题
	 * @returns {object} 返回问题分类和分类对应的问题
	 */
	async getProblemCategories() {
		const res = await db.collection('opendb-news-categories').aggregate()
			// 先条件查询,筛选掉用户隐私协议和退款政策
			.match({
				_id: db.command.nin(['67dbf114189f86a8ae1309c7', '67dbf17db9fb2371a7db87c0','67e276c1bd02205f7b372a0a'])
			})
			// 获取分类对应的问题
			.lookup({
				from: 'opendb-news-articles',
				localField: '_id',
				foreignField: 'category_id',
				as: 'articles'
			})
			// 为每个问题数据添加show展开状态
			.addFields({
				articles: $.map({
					input: '$articles',
					as: 'item',
					in: $.mergeObjects(['$$item', {
						show: false
					}])
				})
			}).end();
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取退款政策和免责声明
	 * @returns {object} 返回退款政策和免责声明
	 */
	async getRefundPolicy(id) {
		const res = await db.collection('opendb-news-categories').aggregate()
			// 先条件查询,筛选掉用户隐私协议和退款政策
			.match({
				_id: id
			})
			// 获取分类对应的问题
			.lookup({
				from: 'opendb-news-articles',
				localField: '_id',
				foreignField: 'category_id',
				as: 'articles'
			}).end();
		return {
			code: 200,
			data: res.data
		}
	},
	/**
	 * 获取充值套餐列表
	 * @returns {object} 返回充值套餐列表
	 */
	async getRechargeMenu() {
		const res = await db.collection('qmy-recharge-menu').orderBy('money', 'asc').get();
		// 所有金额除以100
		const data = res.data.map(item => {
			return {
				...item,
				money: item.money / 100,
				give_money: item.give_money / 100
			}
		});
		return {
			code: 200,
			data: data
		}
	},
	/**
	 * 获取版本审核状态
	 * @returns {object} 返回版本审核状态
	 */
	async getVersionAuditStatus() {
		const res = await db.collection('qmy-debug-status').limit(1).get();
		return {
			code: 200,
			data: res.data
		}
	}
}